[Auth0] Auth0+Amazon EventBridge+AWS Lambda+New Relicで認証・認可のログを自動分析、可視化できるようにしてみた [New Relic]

[Auth0] Auth0+Amazon EventBridge+AWS Lambda+New Relicで認証・認可のログを自動分析、可視化できるようにしてみた [New Relic]

Clock Icon2024.11.25

こんにちは。

ゲームソリューション部の西川です。

今回はAuth0、Amazon EventBridge(以下、EventBridge)、AWS Lambda(以下、Lambda)、New Relicを利用して、認証・認可のログを分析できるようにしてみます。
認証・認可のログを分析できるようになることで、不正アクセスの検知、リアルタイムなアラートの設定、アクティブユーザのトラッキングなどを行えるというメリットがあります。
つまりは、システムだけでなく、ビジネス的な観点でも大きなメリットがあります。
今回の構成であれば、実装・運用コストを抑えて導入することができますので、検討のご参考になれば幸いです。

それではまず、各サービスの説明をしたあと、実際に設定、動作確認を行っていきます。

サービスの説明

Auth0

Auth0は、手軽に認証・認可を実装できるIDaaS(Identity as a Service)プラットフォームです。OAuth、OICD、SAMLなどの標準プロトコルをサポートしており、SSOやMFA、パスキーなどの機能も簡単に導入することができます。
今回は、単純に認証基盤として利用します。
https://auth0.com/

Amazon EventBridge

EventBridgeは、AWSの提供するサーバレスイベントバスサービスです。イベント駆動型アーキテクチャを構築することができます。
今回は、外部サービス(Auth0)と連携し、イベントをLambdaにルーティングして、New Relicにログを連携します。
https://aws.amazon.com/jp/eventbridge/

New Relic

New Relicは、アプリケーションやインフラのパフォーマンスを監視・可視化するためのAPM(Application Performance Monitoring)ツールです。システムの状態をリアルタイムに観測することで、オブザーバビリティの向上を行えます。

それでは、設定を行っていきます。

設定

まずは、Auth0側の設定です。
MonitoringのStreamsからCreate Streamを押下します。
スクリーンショット 2024-11-22 17.33.47

Amazon EventBridgeを選択します。
スクリーンショット 2024-11-22 17.33.55

任意のNameを入力して、Createを押下します。
スクリーンショット 2024-11-22 17.34.12

Streamの作成ができました。
スクリーンショット 2024-11-22 17.34.19

Tutorialには作成したStreamとEventBridgeの連携の設定方法が記載されていますので、こちらを参考に進めていきます。
スクリーンショット 2024-11-22 17.37.15

EventBridgeの設定にいき、パートナーイベントソースにてauth0と検索し、Auth0の設定を押下します。
スクリーンショット 2024-11-22 17.37.47

AWSアカウントIDをコピーします。
スクリーンショット 2024-11-22 17.40.37

コピーしたAWSアカウントIDを作成したStreamの設定のAWS Account IDに入力します。
また、AWS RegionはEventBridgeを作成したリージョンを一致させます。
スクリーンショット 2024-11-22 17.38.34
スクリーンショット 2024-11-22 17.38.50

設定が完了したらSaveを押下します。
これで、Auth0側の設定は完了です。
スクリーンショット 2024-11-22 17.39.46

EventBridgeの設定に戻ります。
Auth0側の設定が正しく行えていれば、パートナーイベントソースから、イベントバスと関連づけられるようになっております。
「関連付ける」を押下します。
スクリーンショット 2024-11-22 17.40.57

関連付けが完了しました。
スクリーンショット 2024-11-22 17.41.11

続いて、Lambdaの作成を行います。
Lambdaから「関数の作成」を押下します。
スクリーンショット 2024-11-22 18.01.23

任意の関数名を入力し、ランタイムは今回は「Python 3.12」を選択します。
「関数の作成」を押下します。
スクリーンショット 2024-11-25 15.56.14

今回、New RelicのLogAPIを使用するため、そのパラメータ周りで必要な環境変数を設定していきます。

New Relic側でライセンスキーを発行します。
API Keysの設定画面から、Key typeはLicenseを選択し、任意のNameを入力します。
スクリーンショット 2024-11-25 16.37.15

作成が完了するとkeyをコピーできるようになっているのでCopy Keyよりコピーします。
スクリーンショット 2024-11-25 16.37.24

Lambdaの画面に戻り、環境変数の設定画面から編集を押下します。
スクリーンショット 2024-11-22 18.03.11

以下のようにそれぞれ設定していきます。
X_License_Key: 上記でコピーしたライセンスキー
Service_Name: Auth0
Hostname: Auth0のホストネーム
設定できたら、「保存」を押下します。
スクリーンショット 2024-11-22 18.06.09

環境変数の設定が完了しました。
スクリーンショット 2024-11-22 18.06.19

続いて、コードソースを書いていきます。
今回はChatGPTでソースの叩き台を出力し、細かいところを修正する形で作成しました。

ソースコード
import os
import json
import requests
from datetime import datetime

# 環境変数から設定を取得
NEW_RELIC_LICENSE_KEY = os.environ['X_License_Key']
SERVICE_NAME = os.environ['Service_Name']
HOSTNAME = os.environ['Hostname']

# New Relic LogAPIのエンドポイント
NEW_RELIC_LOG_API_URL = "https://log-api.newrelic.com/log/v1"

def lambda_handler(event, context):
    """
    Lambda関数のエントリポイント
    """
    try:
        # EventBridgeからAuth0のログを取得
        print("Received event:", json.dumps(event))

        # New Relicに送信するログデータを構築
        log_payload = {
            "timestamp": int(datetime.utcnow().timestamp() * 1000),  # UNIXエポックタイム (ミリ秒)
            "message": event.get('detail'),
            "service_name": SERVICE_NAME,
            "hostname": HOSTNAME
        }

        # New Relic LogAPIに送信
        response = send_log_to_new_relic(log_payload)

        # レスポンスをログに出力
        print(f"New Relic response: {response.status_code}, {response.text}")

    except Exception as e:
        print(f"Error processing event: {str(e)}")
        raise

def send_log_to_new_relic(log_payload):
    """
    New Relic LogAPIにログを送信する
    """
    headers = {
        "Content-Type": "application/json",
        "X-License-Key": NEW_RELIC_LICENSE_KEY,
        "Accept": "*/*"
    }

    # POSTリクエストを送信
    response = requests.post(NEW_RELIC_LOG_API_URL, headers=headers, json=log_payload)

    # エラーハンドリング
    if response.status_code != 202:
        print(f"Failed to send log to New Relic: {response.status_code}, {response.text}")
        response.raise_for_status()

    return response

ソースコードを作成したら、Deployを押下します。

スクリーンショット 2024-11-22 18.19.47

このままだと、インポートしているrequestがインポートできず、エラーが出てくるので、レイヤーを追加しておきます。
「レイヤーの追加」を押下します。
スクリーンショット 2024-11-25 16.01.54

「ARNを指定」を選択し、ARNを入力し、「追加」を押下します。
スクリーンショット 2024-11-25 16.02.12

今回使用したARNは有志によって作成されたものを利用しています。
詳しくは下記をご覧ください。
https://aduce.jp/aws/volunteers-lambda-python-layers
これで、Lambda関数の作成が完了となります。

続いて、EventBridgeに戻り、ルールの作成を行なっていきます。
作成したイベントバスを開き、「ルールを作成」を押下します。
スクリーンショット 2024-11-22 18.23.49

任意の名前の入力し、「次へ」を押下します。
スクリーンショット 2024-11-22 18.24.09

カスタムパターンを選択し、イベントパターンを以下のように入力します。
下記のように入力することで、成功した場合のみイベントが発火するようになります。
入力が完了したら、「次へ」を押下します。

{
  "detail": {
    "data.type": [
      "s"
    ]
  }
}

スクリーンショット 2024-11-22 18.24.35

ターゲット選択にて、ターゲットタイプは「AWSのサービス」、ターゲットを選択は「Lambda関数」、関数は先ほど作成したLambda関数を選択します。
「次へ」を押下します。
スクリーンショット 2024-11-22 18.25.39

特に変更せず「次へ」を押下します。
スクリーンショット 2024-11-22 18.25.46

内容確認して、問題なければ「ルールの作成」を押下します。
スクリーンショット 2024-11-22 18.25.56

ルールの作成が完了しました。
スクリーンショット 2024-11-22 18.26.06

上記設定が完了すると、Lambdaの画面にて、以下のようにトリガーにEventBridgeが表示されるようになります。
スクリーンショット 2024-11-22 18.27.19

これにて、設定が完了しました。

最後に動作確認を行っていきます。

動作確認

サンプルコードを使ってローカルにてアプリケーションを立ち上げ、ログインします。
手順としては省略させていただきます。
スクリーンショット 2024-11-25 16.41.38

サンプルなどについては下記記事をご参照ください。
https://dev.classmethod.jp/articles/auth0-react-tutorial/

NewRelicのLogsを開くと以下のように、ログインをしたタイミングの日時のグラフとログが出力できていることが確認できました。
スクリーンショット 2024-11-25 16.41.46

ログを押下すると、ログの詳細も確認できます。
スクリーンショット 2024-11-25 16.41.56

以上で動作確認も完了となります。
細かいNew Relicの設定などは今回は省略いたします。

さいごに

以上、Auth0、EventBridge、Lambda、New Relicを利用して、認証・認可のログを分析できるようにしてみました。
実際に分析に使うには、New Relic側の設定が必要ですが、今回その辺りの設定は省略させていただきました。

認証・認可のログを分析できるようになることで、システム・ビジネスの観点両方において、大きなメリットが得られると思います。
また、Auth0やNew Relicを利用することで、複雑な実装の手間なく設定を行うことができます。

Auth0によるログの分析方法など検討中の方々のご参考になれば幸いです。

参考

https://dev.classmethod.jp/articles/auth0-logs-to-eventbridge-to-s3-and-newrelic/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.